
/*
Driver.java
Autor: Luis Antonio Sigüenza Leiva
Carné: 10297
Fecha: 22 de septiembre del 2011
 * Descripcion: Simulacion de un banco que devuelve el tiempo promedio
 *              de permanencia de un cliente en el banco
*/

import java.util.Scanner;
import java.util.InputMismatchException;


public class Driver {
    public static void main (String[] args) throws Desbordamiento, Subdesbordamiento{
    
    //Declaracion de objetos
    int[] tiempos= new int[40];
    Cliente[] clientes= new Cliente[80];
    int llenado=0;
    //Declaración de variables
    int t1,t1a=0,contt=0,cont=0, cont3=0, salida=0;
  

    //Desplegamos en pantalla un mensaje de bienvenida y instrucciones
    bienvenida();
    //Pedimos al usuario ingresar tiempos de llegada de los clientes que desea
    do{
       t1= obtenerNumero("Tiempo de llegada del cliente " + (cont +1) + " (1-480)Min: \n",true); //Pedir al usuario el primer numero       
       if (t1>=1 && t1<=480){
               tiempos[cont]=t1;
           cont++;
       }else{
           if (t1<=-1){
           System.out.println("-->Error: tiempo invalido. Ingrese tiempo nuevamente \n");
            }else{
                if (t1==0){
                    System.out.println("--> LLegada de clientes finalizada");
                    salida=1;
                }else
                    if(t1>480){
                        System.out.println("--> El banco ha cerrado");
                        cont++;
                        salida=1;
                    }
           }
       }
    }while (cont<40 && salida!=1);
    
    
    cont3=cont;
    contt=40-cont;
    //Ordenamos cola segun tiempos de entrada por el usuario
    System.out.println("--> ORGANIZAMOS COLAS SEGUN TIEMPO DE ENTRADA");
    selectionSort(tiempos); // Sort them
    
    //Realizamos operaciones con las colas
    ingreso(t1a, tiempos ,contt,cont3);
    
    
    }
    
   public static void ingreso(int t1aa,int[]tiemposs, int contts,int cont3) throws Desbordamiento, Subdesbordamiento{
       //Definimos constantes
       int[] caja= new int[200];
       int cc=0;
       int cc2=0;
       int cc3=contts;
       int tpromedio=0;
       int tpromedio2=0;
    
       //Colas que simulan las cajas del banco
   //*******************************************************************
   //USO LISTAS CIRCULARES    
       //ListaCircular caja1= new ListaCircular(40);
       //ListaCircular caja2= new ListaCircular(40);
       //ListaCircular caja3= new ListaCircular(40);
       //ListaCircular caja4= new ListaCircular(40);
   
   
       
   //*******************************************************************
   //USO DE ARREGLOS    
       //Arreglo caja1= new Arreglo(10);
       //Arreglo caja2= new Arreglo(10);
       //Arreglo caja3= new Arreglo(10);
       //Arreglo caja4= new Arreglo(10);
   
   //*******************************************************************
   //USO DE COLAS DE PRIORIDAD: VECTOR-HEAPS
       
       VectorHeap caja1 = new VectorHeap();
       VectorHeap caja2 = new VectorHeap();
       VectorHeap caja3 = new VectorHeap();
       VectorHeap caja4 = new VectorHeap();    
       
         do{
          t1aa= tiemposs[contts];
          int t2 = (int) (Math.random()*30 + 1); //TIEMPOS DE OPERACION
          Cliente cliente1= new Cliente(t1aa,t2); //Creamos los clientes
          System.out.println(cliente1.toString());   
          contts ++;
          
           //Obtenemos el tiempo que tarda cada cliente en el banco
          caja[cc]=(cliente1.getT3());
          if (caja[cc]<0){
              caja[cc]=(caja[cc]*-1);
              //tpromedio2= tpromedio2 + caja[cc];
          }
          
          //Ingreso Salida de personas en colas
          cc ++;
          caja1.add(caja[cc2]);
          tpromedio2= tpromedio2 + ((int)(caja1.peek()));
        
          caja2.add(caja[cc2+1]);
          tpromedio2= tpromedio2 + ((int)(caja2.peek()));
          
          caja3.add(caja[cc2+2]);
          tpromedio2= tpromedio2 + ((int)(caja3.peek()));
          
          caja4.add(caja[cc2+3]);
          tpromedio2= tpromedio2 + ((int)(caja4.peek()));
          cc2=cc2+1;
          
         }while(contts<40); 
         
         //Calculo del promedio de peramenencia de un cliente en el banco
         tpromedio2= tpromedio2/cont3;
         tpromedio= tpromedio/cont3;
         
         System.out.println();
         System.out.println("-----------------------------------------------------------------------");
         System.out.println("]|I{--------------------------- BANCO UVG -------------------------}I|[");
         System.out.println("-----------------------------------------------------------------------");
         System.out.println("    EL TIEMPO PROMEDIO DE PERMANENCIA DE UN CLIENTE EN EL BANCO ES:    ");
         System.out.println("                                " + tpromedio2 + " MINUTOS                        ");
         System.out.println("-----------------------------------------------------------------------");
   }

        
    
    
    //Método menu: muestra en pantalla el menu principal del probrama
	public static void bienvenida() {
        System.out.println();
        System.out.println("------------------------------------------------");
        System.out.println("]|I{--------------- BANCO UVG --------------}I|[");
        System.out.println("------------------------------------------------");
        System.out.println("             HORARIO: 7 AM - 5 PM               ");
        System.out.println("------------------------------------------------");
        System.out.println("SI INGRESA UN 0 INDICARA QUE NO HAY MAS CLIENTES");
        System.out.println("LIMITE DE INGRESO: 40 CLIENTES (4 VENTANILLAS) \n");
    }
    
        
    //Método para obtener un numero ingresado por el usuario    
    public static int obtenerNumero(String msj, boolean mostrar){
        Scanner teclado = new Scanner(System.in);
        int numero2 = -1;
        int numero=0;
        do{
        	System.out.print(msj);
        	try{
                numero = teclado.nextInt();
                numero2= -1;
            }
            catch(InputMismatchException exception){
                if (mostrar)
                    System.out.println("\nERROR - Dato Invalido\n");
                	numero2=0;
            }
            finally{
                teclado.nextLine();
            }
            
        }while(numero2!=-1);
	return numero;
    }    
        
  //******************************************************
  //*              Metodo selectionSort                  *     
  //******************************************************
  //*Pre: Lista de numeros enteros                       *
  //*Post: Lista de numeros ordenadas de mayor a menor   *
  //******************************************************
  public static void selectionSort(int[] nums) {
    for (int i = 0; i < nums.length; i++) {
      int min = i; 
      for (int j = i; j < nums.length; j++) {
        if (nums[j] < nums[min])
            min = j;
      }
      //Verifica y ordena los numeros de menor a mayor.
      int tmp;
      tmp = nums[i];
      nums[i] = nums[min];
      nums[min] = tmp;
      }
    }
  
 
  

    
}
